iT邦幫忙

2023 iThome 鐵人賽

DAY 23
0

今天我們來介紹如何進 console 的環境,來進行物件的語法查詢、CRUD

進入 console

$ python manage.py shell


------
Python 3.11.4 (main, Jun 16 2023, 17:11:43) [Clang 14.0.3 (clang-1403.0.22.14.1)] on darwin
Type "help", "copyright", "credits" or "license" for more information.
(InteractiveConsole)

這個就相當於 ROR 的 rails c
不過差異最大的地方就在於,ROR 的 console 環境很好閱讀,Django 的環境超級難閱讀


進入 shell 後,我們照著以下指令輸入:

查看所有的 Employer

>>> from online.models import Employer, Store, Product
>>> Employer.objects.all()

------
<QuerySet [<Employer: 多尼多尼-橋八>, <Employer: 黑腳-香桔士>, <Employer: 草帽-魯伕>]>

可以發現我們像剛剛的畫面一樣,抓出目前所有的 Employer 資料

查看 Employer 所有欄位

要怎麼查看所有的欄位呢?

>>> Employer._meta.fields


------
(<django.db.models.fields.BigAutoField: id>, <django.db.models.fields.CharField: first_name>, <django.db.models.fields.CharField: last_name>, <django.db.models.fields.PositiveIntegerField: age>)

雖然有點不好觀看,但應該還是可以免強看得出來有這幾個欄位: idfirst_namelast_nameage

在 console 環境新增 Employer

>>> e = Employer(first_name="小偷",last_name="那每", age=18)
>>> e.save()
>>> e.id

------
5

當你根據欄位,新增完一個新的老闆後,記得要用save儲存,要不然這個物件不會存入資料庫,存好後確認一下是否有產生 id,如果有的話就代表成功新增了。
Ps. 你們的數字不一樣會跟我一樣喔,因為數字是根據你老闆數量所產生的

>>> Employer.objects.all()

------
<QuerySet [<Employer: 多尼多尼-橋八>, <Employer: 小偷-那每>, <Employer: 黑腳-香桔士>, <Employer: 草帽-魯伕>]>

這時候我們在用查詢語法,查所有的老闆有哪些,可以發現剛剛新增的 小偷-那每 在裡面

在 console 環境修改值

>>> e.first_name = "美女"
>>> e.save()
>>> e

------
<Employer: 美女-那每>

我們剛剛修改了 Employer 的值,這邊你有沒有發現一件事,就是印出來的值,是我們當初在 models.py 那邊設定的 __str__ ,因此我們修改 first_name 後,最後印出來是 修改過的 first_name-last_name

filter 語法篩選特定物件

如果今天我想要找到 ID 為 3 的 Employer 物件要怎麼輸入呢?

>>> Employer.objects.filter(id=3)

------
<QuerySet [<Employer: 黑腳-香桔士>]>

剛剛是指定 ID 為 3 的物件,我現在想要篩選出 Employer 物件的 first_name 包含 這個字的 Employer:

>>> Employer.objects.filter(first_name__contains='美')

------
<QuerySet [<Employer: 美女-那每>]>

可以發現他是一個陣列,所以如果今天有兩個以上的 Employerfirst_name 開頭,就可以抓到他們

關聯查找

這個應該很熟悉了,畢竟前面我們前面學了好幾次,不過我們這次用 console 來操作試試:

  1. 首先抓到 id 為 3 的 Employer - 你們可以隨意指定一個 id
  2. 從陣列取出指定物件 - e3[0]
  3. employer.store_set.all() 的方法,取到該老闆所開設的商店
>>> e3 = Employer.objects.filter(id=3)
>>> e3[0].store_set.all()

------
<QuerySet [<Store: 海上餐廳>, <Store: ALL BLUE餐館>]>

用關聯創建新的物件

我們現在來用剛剛新增的 Employer,使用關聯語法來新增這個老闆的 Store:

  1. 確認 Store 有哪些欄位 : Store._meta.fields
  2. 確認現在該老闆開設的商店有哪些,應該是空的,因為此老闆是新創的 : e.store_set.all()
  3. 關聯創建新的 Store : e.store_set.create()
  4. 儲存物件 : new_store.save()
  5. 確認物件有存進資料庫 : new_store.id
  6. 再次查看 : e.store_set.all()
>>> Store._meta.fields

------
(<django.db.models.fields.BigAutoField: id>, <django.db.models.fields.CharField: title>, <django.db.models.fields.TextField: description>, <django.db.models.fields.related.ForeignKey: employer>)

============================
>>> e.store_set.all()

------
<QuerySet []>


============================
>>> new_store = e.store_set.create(title="橘子員", description="種一堆水果的地方")
>>> new_store.save()
>>> new_store.id

------
7

============================
e.store_set.all()

------
<QuerySet [<Store: 橘子員>]>

刪除物件

我們在這邊刪除剛剛新增的 Employer 物件:

>>> e.delete()

------
(1, {'online.Employer': 1})

接著再查看物件是否刪除:

>>> Employer.objects.all()

------
<QuerySet [<Employer: 多尼多尼-橋八>, <Employer: 黑腳-香桔士>, <Employer: 草帽-魯伕>]>

可以發現剛剛新增的物件已經消失

這樣子就學完基本在 console 操作的指令拉,不過說真的在這邊操作其實不是很方便,如果你之前是寫 ROR 的朋友應該很能理解,因為 Django 的 console 介面真的非常難以閱讀,因此明天我們來介紹 Django 提供的另外一個功能 Django admin,讓我們可以直接在後台快速 CRUD

Ps. 剛剛在終端機寫的語法,都可以在 Django 檔案中使用喔~

總結

今天學到哪些東西呢?

  1. Django console 的一堆語法設定

最後附上 Github: https://github.com/eagle0526/Django-store


上一篇
DAY22 - 首頁 index.html 頁面設定
下一篇
DAY24 - Django admin 介紹 - 1
系列文
Django 初學入門 - 從 ROR 的角度來學習 Django30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言